package com.bqy.myokgo.base;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.bqy.myokgo.utils.OnAppListener;

/**
 * 熊猫先生
 * 2019/1/29:11:17
 */

public abstract class MyBaseFragment extends Fragment {

    public FragmentTransaction fragmentTransaction;
    /**
     * 视图是否已经初初始化
     */
    protected boolean isInit = false;
    protected boolean isLoad = false;
    private View view;

    /**
     * Fragment与ACT通讯
     */
    OnAppListener.OnfragListener l;

    public void setOnfragListener(OnAppListener.OnfragListener l) {
        this.l = l;
    }

    public OnAppListener.OnfragListener getListener() {
        return l;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(setContentView(), container, false);
            if (getActivity() instanceof OnAppListener.OnfragListener)
                l = (OnAppListener.OnfragListener) getActivity();
            isInit = true;
            /**初始化的时候去加载数据**/
            isCanLoadData();
        }
        //缓存的rootView需要判断是否已经被加过parent， 如果有parent需要从parent删除，要不然会发生这个rootview已经有parent的错误。
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }
        return view;
    }

    /**
     * 视图是否已经对用户可见，系统的方法
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
    }

    /**
     * 是否可以加载数据
     * 可以加载数据的条件：
     * 1.视图已经初始化
     * 2.视图对用户可见
     */
    private void isCanLoadData() {
        if (!isInit || isLoad) {
            return;
        }

        if (getUserVisibleHint()) {
            iniGreate();
            iniView();
            iniClick();
            iniData();
            isLoad = true;
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }

    /**
     * 视图销毁的时候讲Fragment是否初始化的状态变为false
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isInit = false;
        isLoad = false;
    }

    /**
     * 获取设置的布局
     *
     * @return
     */
    protected View getContentView() {
        return view;
    }

    /**
     * 找出对应的控件
     *
     * @param id
     * @param <T>
     * @return
     */
    protected <T extends View> T findViewById(int id) {
        return (T) getContentView().findViewById(id);
    }


    /**
     * 当视图已经对用户不可见并且加载过数据，如果需要在切换到其他页面时停止加载数据，可以覆写此方法
     */
    protected void stopLoad() {

    }

    /**
     * 设置布局
     */
    protected abstract int setContentView();

    /**
     * 当视图初始化并且对用户可见的时候去真正的加载数据
     */
    public void iniGreate() {

    }

    public void iniView() {

    }

    public void iniClick() {

    }

    public void iniData() {

    }
}
